package com.boomshake.service;

import com.boomshake.common.PageResult;
import com.boomshake.dto.RealNameRequest;
import com.boomshake.dto.SetDistributorDTO;
import com.boomshake.dto.UpdateUserRequest;
import com.boomshake.dto.UserPageQueryDTO;
import com.boomshake.dto.WeChatLoginRequest;
import com.boomshake.entity.User;
import com.boomshake.vo.LoginResponseVO;
import com.boomshake.vo.SetDistributorVO;
import com.boomshake.vo.UserInfoVO;
import com.boomshake.vo.UserPageVO;

/**
 * 用户Service接口
 *
 * @author BoomShake
 * @date 2024-12-15
 */
public interface UserService {

    /**
     * 微信登录
     *
     * @param request 登录请求
     * @return 登录响应
     */
    LoginResponseVO wechatLogin(WeChatLoginRequest request);

    /**
     * 根据用户ID获取用户信息
     *
     * @param userId 用户ID
     * @return 用户信息
     */
    UserInfoVO getUserInfo(Long userId);

    /**
     * 根据openid查询用户
     *
     * @param openid 微信openid
     * @return 用户实体
     */
    User getUserByOpenid(String openid);

    /**
     * 创建新用户
     *
     * @param openid 微信openid
     * @param unionid 微信unionid
     * @return 用户实体
     */
    User createUser(String openid, String unionid);

    /**
     * 更新用户信息
     *
     * @param userId 用户ID
     * @param user 用户信息
     * @return 是否成功
     */
    boolean updateUserInfo(Long userId, User user);

    /**
     * 提交实名认证
     *
     * @param userId 用户ID
     * @param request 实名认证请求
     * @return 是否成功
     */
    boolean submitRealNameAuth(Long userId, RealNameRequest request);

    /**
     * 更新用户个人资料
     *
     * @param userId 用户ID
     * @param request 更新请求
     * @return 是否成功
     */
    boolean updateProfile(Long userId, UpdateUserRequest request);
    
    /**
     * 管理端查询用户列表
     *
     * @param queryDTO 查询参数
     * @return 用户分页列表
     */
    PageResult<UserPageVO> getUserList(UserPageQueryDTO queryDTO);
    
    /**
     * 管理端根据ID查询用户详情
     *
     * @param userId 用户ID
     * @return 用户详情
     */
    UserPageVO getUserDetail(Long userId);
    
    /**
     * 设置用户为分销员
     *
     * @param userId 用户ID
     * @param dto 分销员设置参数
     * @param operatorId 操作人ID
     * @return 设置结果
     */
    SetDistributorVO setDistributor(Long userId, SetDistributorDTO dto, Long operatorId);
} 